package com.example.javabasic.thread.classtwo.singleton.demo2;

//volatile 关键字

/**
 * 读操作不会更新内存中的值, 只需要从缓存中拿数据
 * 写操作 更新内容会更新 主内存中的值
 *
 * 如果只有写操作, 那么就不会读取内存只读缓存(属于优化一方面的)
 *
 *
 * 线程安全问题就是缓存不一致的问题
 *
 */

/**
 * 总线:
 * 1.数据总线
 * 2.地址总线
 * 3.控制总线
 *
 * cpu高速缓存一致性协议
 *总线加锁
 *
 *
 * 当cpu写入数据的时候,如果发现该变量被共享,也就是说,在其他cpu中也有该变量的副本,会发出一个信号,通知其他cpu 该变量的缓存无效,
 * 当其他cpu访问变量的时候,重新到主内存进行获取
 */
public class VolatileTest {
    //初始值
    private volatile static int INIT_VALUE = 0;
    //最大长度
    private final static int MAX_LIMIT = 5;

    public static void main(String[] args) {
        new Thread(()->{
            int local = INIT_VALUE;
            while(local<MAX_LIMIT){
                if(local!= INIT_VALUE){
                    System.out.printf(" 内容更新了,更新为:[%d] ",INIT_VALUE);
                    local = INIT_VALUE;
                }
            }
        },"reader").start();


        new Thread(()->{
            int local = INIT_VALUE;
            while(INIT_VALUE<MAX_LIMIT){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.printf(" \n更新内容为 %d",++local);
                INIT_VALUE = local;
            }
        },"update").start();
    }



}
